package com.codesuc.aichat.exception;

import cn.dev33.satoken.exception.NotLoginException;
import com.codesuc.aichat.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Description Sa-Token 未登录异常全局处理器
 * @Author Mr.Zhang
 * @Date 2025/8/5 21:11
 * @Version 1.0
 */
@Slf4j
@ControllerAdvice
public class NotLoginExceptionHandler {

    @ExceptionHandler(value = NotLoginException.class)  // 处理 Exception 类型的异常
    @ResponseBody  // 全局异常处理相当于就是一个 Controller，所以返回 json 格式的数据需要加此注解
    public Result<Void> handler(NotLoginException e) {
        log.error("NotLoginException 异常：", e);

        String message;
        if (e.getType().equalsIgnoreCase(NotLoginException.NOT_TOKEN)) {
            message = "未能读取到有效 token";
        } else if (e.getType().equals(NotLoginException.INVALID_TOKEN)) {
            message = "token 无效";
        } else if (e.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
            message = "token 已过期";
        } else if (e.getType().equals(NotLoginException.BE_REPLACED)) {
            message = "token 已被顶下线";
        } else if (e.getType().equals(NotLoginException.KICK_OUT)) {
            message = "token 已被踢下线";
        } else if (e.getType().equals(NotLoginException.TOKEN_FREEZE)) {
            message = "token 已被冻结";
        } else if (e.getType().equals(NotLoginException.NO_PREFIX)) {
            message = "未按照指定前缀提交 token";
        } else {
            message = "当前会话未登录";
        }

        // 返回给前端
        return Result.error(message);
    }
}
